#include "imgui/phong/Editor.h"

using namespace ImGui::Phong;
using namespace Ogl::Phong;

bool Editor::Edit(LightEffect& inst)
{
	bool res = false;
	ImGui::PushID(&inst);

	res |= ImGui::SliderInt("numDirection", &inst.numDirlights, 0, Ogl::Phong::maxDirNum - 1);
	res |= ImGui::SliderInt("numPoint", &inst.numPoints, 0, Ogl::Phong::maxDirNum - 1);
	res |= ImGui::SliderInt("numSpot", &inst.numSpotLights, 0, Ogl::Phong::maxDirNum - 1);

	for (int i = 0; i < inst.numDirlights; i++)
	{
		res |= Edit(inst.dirlights[i]);
	}
	for (int i = 0; i < inst.numPoints; i++)
	{
		res |= Edit(inst.pointLights[i]);
	}
	for (int i = 0; i < inst.numSpotLights; i++)
	{
		res |= Edit(inst.spotLights[i]);
	}
	ImGui::PopID();
	return res;
}

bool Editor::Edit(PointLight& inst)
{
	ImGui::PushID(&inst);

	bool res;

	res |= ImGui::ColorEdit4("ambient", &inst.ambient.x);
	res |= ImGui::ColorEdit4("diffuse", &inst.diffuse.x);
	res |= ImGui::ColorEdit4("specular", &inst.specular.x);
	res |= ImGui::DragFloat3("position", &inst.position.x);
	res |= ImGui::DragFloat("constant", &inst.constant);
	res |= ImGui::DragFloat("linear", &inst.linear);
	res |= ImGui::DragFloat("quadratic", &inst.quadratic);
	ImGui::PopID();

	return res;
}

bool Editor::Edit(SpotLight& inst)
{
	bool res = false;

	ImGui::PushID(&inst);
	res |= ImGui::ColorEdit4("ambient", &inst.ambient.x);
	res |= ImGui::ColorEdit4("diffuse", &inst.diffuse.x);
	res |= ImGui::ColorEdit4("specular", &inst.specular.x);
	res |= ImGui::DragFloat3("position", &inst.position.x);
	res |= ImGui::DragFloat("cutOff", &inst.cutOff);
	res |= ImGui::DragFloat("outerCutOff", &inst.outerCutOff);
	res |= ImGui::DragFloat3("direction", &inst.direction.x);
	res |= ImGui::DragFloat("constant", &inst.constant);
	res |= ImGui::DragFloat("linear", &inst.linear);
	res |= ImGui::DragFloat("quadratic", &inst.quadratic);

	ImGui::PopID();
	return res;
}

bool Editor::Edit(DirLight& inst)
{
	bool res=false;
	ImGui::PushID(&inst);
	res |= ImGui::ColorEdit4("ambient", &inst.ambient.x);
	res |= ImGui::ColorEdit4("diffuse", &inst.diffuse.x);
	res |= ImGui::ColorEdit4("specular", &inst.specular.x);
	res |= ImGui::DragFloat3("direction", &inst.direction.x);

	ImGui::PopID();
	return res;
}

bool Editor::Edit(Material& inst)
{
	bool res;


	ImGui::PushID(&inst);
	res |= ImGui::ColorEdit4("ambient", &inst.ambient.x);
	res |= ImGui::ColorEdit4("diffuse", &inst.diffuse.x);
	res |= ImGui::ColorEdit4("specular", &inst.specular.x);

	ImGui::PopID();
	return res;
}
